package main

import (
	"bufio"
	"fmt"
	"math"
	"os"
	"strconv"
	"strings"
)

const Pi = math.Pi

func getInput() string {
	// 使用os.Stdin开启输入流
	// 函数原型 func NewReader(rd io.Reader) *Reader
	// NewReader创建一个具有默认大小缓冲、从r读取的*Reader 结构见官方文档
	in := bufio.NewReader(os.Stdin)
	// in.ReadLine函数具有三个返回值 []byte bool error
	// 分别为读取到的信息 是否数据太长导致缓冲区溢出 是否读取失败
	str, _, err := in.ReadLine()
	if err != nil {
		return err.Error()
	}
	return string(str)
}

func CalCircleArea(radius float64) (err error, area float64) {
	area = Pi * math.Pow(radius, 2)
	return
}

func SumCircleArea(circleAreas []float64) (circleAreaSum float64) {
	for _, circleArea := range circleAreas {
		circleAreaSum += circleArea
	}
	return
}

func main() {
	for {
		// 获取用户的输入，并增加简单的退出和输入校验功能
		fmt.Print("输入圆的半径(单位：m)，空格分隔输入多个值，计算面积之和。输入 q 退出：")
		var input string
		input = getInput()
		if input == "q" {
			fmt.Println("程序退出")
			break
		} else if input == "" {
			fmt.Println("未检测到输入，请输入")
			continue
		}
		// 非法输入标志位，默认为 false 即合法
		var illegalInput bool
		// 从用户的输入中遍历数字元素，分别进行面积计算，返回面积的集合
		var Areas []float64
		for _, element := range strings.Split(input, " ") {
			radius, err := strconv.ParseFloat(element, 64)
			if err != nil {
				illegalInput = true
				continue
			}
			err2, area := CalCircleArea(radius)
			if err2 != nil {
				fmt.Printf("面积计算出错，原因：%v\n", err2)
				return
			}
			Areas = append(Areas, area)
		}
		if illegalInput {
			fmt.Println("检测到非数字输入或多余的空格，程序自动忽略")
		}
		// 调一下面积累加函数，返回所有面积之和
		sumArea := SumCircleArea(Areas)
		// 判断面积集合的长度，返回相应的结果
		switch len(Areas) {
		case 0:
			fmt.Println("没有计算到面积，没有输入数字哦，请重新输入")
		case 1:
			fmt.Printf("输入了 1 个圆的半径，它的面积是 %.3f m²\n", sumArea)
		default:
			fmt.Printf("输入了 %v 个圆的半径，它们的面积之和为 %.3f m²\n", len(Areas), sumArea)
		}
	}
}
